additionalAutoloader = $additionalAutoloader;
$this->changedFilesDetector = $changedFilesDetector;
$this->configInitializer = $configInitializer;
$this->applicationFileProcessor = $applicationFileProcessor;
$this->dynamicSourceLocatorDecorator = $dynamicSourceLocatorDecorator;
$this->outputFormatterCollector = $outputFormatterCollector;
$this->symfonyStyle = $symfonyStyle;
$this->memoryLimiter = $memoryLimiter;
$this->configurationFactory = $configurationFactory;
$this->deprecatedRulesReporter = $deprecatedRulesReporter;
$this->missConfigurationReporter = $missConfigurationReporter;
parent::__construct();
}
protected function configure() : void
{
$this->setName('process');
$this->setDescription('Upgrades or refactors source code with provided rectors');
$this->setHelp(<<<'EOF'
The %command.name% command will run Rector main feature:
%command.full_name%
To specify a folder or a file, you can run:
%command.full_name% src/Controller
You can also dry run to see the changes that Rector will make with the --dry-run option:
%command.full_name% src/Controller --dry-run
It's also possible to get debug via the --debug option:
%command.full_name% src/Controller --dry-run --debug
EOF
);
ProcessConfigureDecorator::decorate($this);
parent::configure();
}
protected function execute(InputInterface $input, OutputInterface $output) : int
{
// missing config? add it :)
if (!$this->configInitializer->areSomeRectorsLoaded()) {
$this->configInitializer->createConfig(\getcwd());
return self::SUCCESS;
}
$configuration = $this->configurationFactory->createFromInput($input);
$this->memoryLimiter->adjust($configuration);
// disable console output in case of json output formatter
if ($configuration->getOutputFormat() === JsonOutputFormatter::NAME) {
$this->symfonyStyle->setVerbosity(OutputInterface::VERBOSITY_QUIET);
}
$this->additionalAutoloader->autoloadInput($input);
$this->additionalAutoloader->autoloadPaths();
$paths = $configuration->getPaths();
// 1. add files and directories to static locator
$this->dynamicSourceLocatorDecorator->addPaths($paths);
if ($this->dynamicSourceLocatorDecorator->isPathsEmpty()) {
// read from rector.php, no paths definition needs withPaths() config
if ($paths === []) {
$this->symfonyStyle->error('No paths definition in rector configuration, define paths: https://getrector.com/documentation/define-paths');
return ExitCode::FAILURE;
}
// read from cli paths arguments, eg: vendor/bin/rector process A B C which A, B, and C not exists
$isSingular = \count($paths) === 1;
$this->symfonyStyle->error(\sprintf('The following given path%s do%s not match any file%s or director%s: %s%s', $isSingular ? '' : 's', $isSingular ? 'es' : '', $isSingular ? '' : 's', $isSingular ? 'y' : 'ies', \PHP_EOL . \PHP_EOL . ' - ', \implode(\PHP_EOL . ' - ', $paths)));
return ExitCode::FAILURE;
}
// MAIN PHASE
// 2. run Rector
$processResult = $this->applicationFileProcessor->run($configuration, $input);
// REPORTING PHASE
// 3. reporting phaseRunning 2nd time with collectors data
// report diffs and errors
$outputFormat = $configuration->getOutputFormat();
$outputFormatter = $this->outputFormatterCollector->getByName($outputFormat);
$outputFormatter->report($processResult, $configuration);
$this->deprecatedRulesReporter->reportDeprecatedRules();
$this->deprecatedRulesReporter->reportDeprecatedSkippedRules();
$this->missConfigurationReporter->reportSkippedNeverRegisteredRules();
return $this->resolveReturnCode($processResult, $configuration);
}
protected function initialize(InputInterface $input, OutputInterface $output) : void
{
$application = $this->getApplication();
if (!$application instanceof Application) {
throw new ShouldNotHappenException();
}
$optionDebug = (bool) $input->getOption(Option::DEBUG);
if ($optionDebug) {
$application->setCatchExceptions(\false);
}
// clear cache
$optionClearCache = (bool) $input->getOption(Option::CLEAR_CACHE);
if ($optionDebug || $optionClearCache) {
$this->changedFilesDetector->clear();
}
}
/**
* @return ExitCode::*
*/
private function resolveReturnCode(ProcessResult $processResult, Configuration $configuration) : int
{
// some system errors were found → fail
if ($processResult->getSystemErrors() !== []) {
return ExitCode::FAILURE;
}
// inverse error code for CI dry-run
if (!$configuration->isDryRun()) {
return ExitCode::SUCCESS;
}
if ($processResult->getFileDiffs() !== []) {
return ExitCode::CHANGED_CODE;
}
return ExitCode::SUCCESS;
}
}